package com.cencat.merchant.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cencat.common.exception.BusinessException;
import com.cencat.merchant.entity.MerchantUser;

import java.util.List;
import java.util.Map;

/**
 * 商家用户服务接口
 * @author cencat
 * @since 2024-01-01
 */
public interface MerchantUserService {

    /**
     * 创建商家用户
     * @param merchantUser 商家用户信息
     * @return 用户ID
     * @throws BusinessException 业务异常
     */
    Long createMerchantUser(MerchantUser merchantUser) throws BusinessException;

    /**
     * 更新商家用户信息
     * @param merchantUser 商家用户信息
     * @return 更新结果
     * @throws BusinessException 业务异常
     */
    Boolean updateMerchantUser(MerchantUser merchantUser) throws BusinessException;

    /**
     * 删除商家用户
     * @param userId 用户ID
     * @return 删除结果
     * @throws BusinessException 业务异常
     */
    Boolean deleteMerchantUser(Long userId) throws BusinessException;

    /**
     * 根据ID查询商家用户
     * @param userId 用户ID
     * @return 用户信息
     * @throws BusinessException 业务异常
     */
    MerchantUser getMerchantUserById(Long userId) throws BusinessException;

    /**
     * 根据用户名查询商家用户
     * @param username 用户名
     * @return 用户信息
     * @throws BusinessException 业务异常
     */
    MerchantUser getMerchantUserByUsername(String username) throws BusinessException;

    /**
     * 根据手机号查询商家用户
     * @param phone 手机号
     * @return 用户信息
     * @throws BusinessException 业务异常
     */
    MerchantUser getMerchantUserByPhone(String phone) throws BusinessException;

    /**
     * 根据邮箱查询商家用户
     * @param email 邮箱
     * @return 用户信息
     * @throws BusinessException 业务异常
     */
    MerchantUser getMerchantUserByEmail(String email) throws BusinessException;

    /**
     * 根据商家ID查询用户列表
     * @param merchantId 商家ID
     * @return 用户列表
     */
    List<MerchantUser> getMerchantUsersByMerchantId(Long merchantId);

    /**
     * 分页查询商家用户列表
     * @param page 分页参数
     * @param tenantId 租户ID
     * @param merchantId 商家ID（可选）
     * @param username 用户名（可选）
     * @param realName 真实姓名（可选）
     * @param phone 手机号（可选）
     * @param status 状态（可选）
     * @return 分页结果
     */
    IPage<MerchantUser> getMerchantUserPage(Page<MerchantUser> page,
                                           Long tenantId,
                                           Long merchantId,
                                           String username,
                                           String realName,
                                           String phone,
                                           String status);

    /**
     * 商家用户登录
     * @param username 用户名
     * @param password 密码
     * @return 用户信息
     * @throws BusinessException 业务异常
     */
    MerchantUser login(String username, String password) throws BusinessException;

    /**
     * 更新登录信息
     * @param userId 用户ID
     * @param loginIp 登录IP
     * @return 更新结果
     * @throws BusinessException 业务异常
     */
    Boolean updateLoginInfo(Long userId, String loginIp) throws BusinessException;

    /**
     * 修改密码
     * @param userId 用户ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 修改结果
     * @throws BusinessException 业务异常
     */
    Boolean changePassword(Long userId, String oldPassword, String newPassword) throws BusinessException;

    /**
     * 重置密码
     * @param userId 用户ID
     * @param newPassword 新密码
     * @return 重置结果
     * @throws BusinessException 业务异常
     */
    Boolean resetPassword(Long userId, String newPassword) throws BusinessException;

    /**
     * 启用用户
     * @param userId 用户ID
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Boolean enableUser(Long userId) throws BusinessException;

    /**
     * 禁用用户
     * @param userId 用户ID
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Boolean disableUser(Long userId) throws BusinessException;

    /**
     * 锁定用户
     * @param userId 用户ID
     * @param lockMinutes 锁定分钟数
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Boolean lockUser(Long userId, Integer lockMinutes) throws BusinessException;

    /**
     * 解锁用户
     * @param userId 用户ID
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Boolean unlockUser(Long userId) throws BusinessException;

    /**
     * 检查用户名是否存在
     * @param username 用户名
     * @param excludeId 排除的用户ID（用于更新时检查）
     * @return 是否存在
     */
    Boolean checkUsernameExists(String username, Long excludeId);

    /**
     * 检查手机号是否存在
     * @param phone 手机号
     * @param excludeId 排除的用户ID（用于更新时检查）
     * @return 是否存在
     */
    Boolean checkPhoneExists(String phone, Long excludeId);

    /**
     * 检查邮箱是否存在
     * @param email 邮箱
     * @param excludeId 排除的用户ID（用于更新时检查）
     * @return 是否存在
     */
    Boolean checkEmailExists(String email, Long excludeId);

    /**
     * 验证密码
     * @param rawPassword 原始密码
     * @param encodedPassword 加密密码
     * @param salt 盐值
     * @return 验证结果
     */
    Boolean verifyPassword(String rawPassword, String encodedPassword, String salt);

    /**
     * 加密密码
     * @param rawPassword 原始密码
     * @param salt 盐值
     * @return 加密密码
     */
    String encodePassword(String rawPassword, String salt);

    /**
     * 生成盐值
     * @return 盐值
     */
    String generateSalt();

    /**
     * 统计商家用户数量
     * @param merchantId 商家ID
     * @return 用户数量
     */
    Long countUsersByMerchantId(Long merchantId);

    /**
     * 统计各状态用户数量
     * @param merchantId 商家ID
     * @return 统计结果
     */
    Map<String, Long> countUsersByStatus(Long merchantId);

    /**
     * 批量导入商家用户
     * @param users 用户列表
     * @param merchantId 商家ID
     * @return 导入结果
     * @throws BusinessException 业务异常
     */
    Map<String, Object> batchImportUsers(List<MerchantUser> users, Long merchantId) throws BusinessException;

    /**
     * 导出商家用户数据
     * @param merchantId 商家ID
     * @param userIds 用户ID列表（可选）
     * @return 用户数据
     */
    List<MerchantUser> exportUsers(Long merchantId, List<Long> userIds);

    /**
     * 检查用户是否被锁定
     * @param userId 用户ID
     * @return 是否被锁定
     */
    Boolean isUserLocked(Long userId);

    /**
     * 增加密码错误次数
     * @param userId 用户ID
     * @return 当前错误次数
     * @throws BusinessException 业务异常
     */
    Integer incrementPasswordErrorCount(Long userId) throws BusinessException;

    /**
     * 清除密码错误次数
     * @param userId 用户ID
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Boolean clearPasswordErrorCount(Long userId) throws BusinessException;

    /**
     * 设置用户角色
     * @param userId 用户ID
     * @param roleIds 角色ID列表
     * @return 设置结果
     * @throws BusinessException 业务异常
     */
    Boolean setUserRoles(Long userId, List<Long> roleIds) throws BusinessException;

    /**
     * 设置用户权限
     * @param userId 用户ID
     * @param permissions 权限列表
     * @return 设置结果
     * @throws BusinessException 业务异常
     */
    Boolean setUserPermissions(Long userId, List<String> permissions) throws BusinessException;
}